package com.hollis公众号.list序列化;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class Test {

	/**
	 * 我们来看ArrayList的源码
	public class ArrayList<E> extends AbstractList<E> implements Serializable {
	   private static final long serialVersionUID = 8683452581122892189L;
	   transient Object[] elementData; // non-private to simplify nested class access
	}
	笔者省略了其他成员变量，从上面的代码中可以知道ArrayList实现了java.io.Serializable接口，那么我们就可以对它进行序列化及反序列化。因为负责保存元素的elementData是transient的，
	所以我们认为这个成员变量的内容不会被序列化而保留下来。我们写一个Demo，验证一下我们的想法：
	问：为什么code 2的结果却通过序列化和反序列化把List中的元素保留下来了呢？通过readObject和writeObject
	 * @param args
	 * @throws IOException
	 * @throws ClassNotFoundException
	 */
	public static void main(String[] args) throws IOException, ClassNotFoundException {
		ArrayList stringList = new ArrayList(4);
		stringList.add("hello");
		stringList.add("world");
		stringList.add("hollis");
		stringList.add("chuang");
		System.out.println("init StringList" + stringList);
		ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("stringlist"));
		objectOutputStream.writeObject(stringList);
		objectOutputStream.close();

		File file = new File("stringlist");
		ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(file));
		ArrayList newStringList = (ArrayList) objectInputStream.readObject();
		objectInputStream.close();
		if (file.exists()) {
			file.delete();
		}
		System.out.println("new StringList" + newStringList);
	}

}
